package TP2;

import TP2.TDA.ConjuntoTDA;
import TP2.TDA.DiccionarioMultipleTDA;
import TP2.implementation.ConjuntoTamNoAcotListaImpl1;

public class DiccionarioMultipleListaImpl implements DiccionarioMultipleTDA {
	NodoDiccionarioMultiple lista;
	

	public void inicializar() {
		lista = null;
	}

	public void agregar(int clave, int valor) {
		NodoDiccionarioMultiple aux = lista;
		
		while(aux != null && aux.getClave() != clave) {
			aux = aux.getSgte();
		}
		
		if(aux != null) { // Lo encontro, agrego el valor al conjunto de valores
			aux.getValores().agregar(valor);
		} else { // No lo encontro, agrego al comienzo
			NodoDiccionarioMultiple nuevo = new NodoDiccionarioMultiple();
			nuevo.setClave(clave);
			nuevo.setValores(new ConjuntoTamNoAcotListaImpl1());
			nuevo.getValores().inicializar();
			nuevo.getValores().agregar(valor);
			nuevo.setSgte(lista);
			lista = nuevo;
		}
	}

	public void eliminar(int clave) {
		NodoDiccionarioMultiple aux, prev;
		
		aux = lista;
		prev = null;
		
		while(aux != null && aux.getClave() != clave) {
			prev = aux;
			aux = aux.getSgte();
		}		
		
		if(aux != null) { // La encontro, la elimino
			prev.setSgte(aux.getSgte());
		} else {
			// No la encontro, no hago nada
		}
	}

	public void eliminarValor(int clave, int valor) {
		NodoDiccionarioMultiple aux;
		
		aux = lista;
		
		while(aux != null && aux.getClave() != clave) {
			aux = aux.getSgte();
		}		
		
		if(aux != null) { // La encontro, la elimino
			aux.getValores().sacar(valor);
			if(aux.getValores().vacio()) {
				eliminar(clave);
			}
		} else {
			// No la encontro, no hago nada
		}
	}

	public ConjuntoTDA recuperar(int clave) {
		NodoDiccionarioMultiple aux = lista;
		
		while(aux != null && aux.getClave() != clave) {
			aux = aux.getSgte();
		}
		
		if(aux != null) { // La encontro
			return aux.getValores();
		} else { // No la encontro, devuelvo un conjunto vacio
			ConjuntoTDA conj = new ConjuntoTamNoAcotListaImpl1();
			conj.inicializar();
			return conj;
		}
	}

	public ConjuntoTDA claves() {
		NodoDiccionarioMultiple aux = lista;
		ConjuntoTDA conj = new ConjuntoTamNoAcotListaImpl1();
		conj.inicializar();
		
		while(aux != null) {
			conj.agregar(aux.getClave());
			aux = aux.getSgte();
		}
		
		return conj;
	}

}
